package top.dingwen.io.treasure.api.auth;

import cn.hutool.core.lang.Pair;
import top.dingwen.io.treasure.api.base.constant.ApiConstant;

/**
 * 令牌服务
 *
 * @author dingwen
 * @since 2024/4/14 20:14
 */
@SuppressWarnings(ApiConstant.ALL)
public interface TokenService {
    /**
     * 创建一个令牌
     *
     * @param request 请求入参
     * @return {@link String}
     */
    String createToken(AuthUserRequest request);

    /**
     * 刷新令牌
     *
     * @param oldToken 旧令牌
     * @return {@link String}
     */
    String refreshToken(String oldToken);

    /**
     * 校验令牌 </br>
     * <ul>
     *     <li> 是否过期</li>
     *     <li> 是否合法 </li>
     * </ul>
     *
     * @return boolean
     */
    boolean validateToken();

    /**
     * 从redis中获取登录的用户
     *
     * @return {@link Pair }<{@link String }, {@link AuthUserResponse }> key: 缓存键, value: 登录用户信息
     */
    Pair<String, AuthUserResponse> getUser();

    /**
     * 删除用户
     *
     * @return boolean 是否删除成功
     */
    boolean removeUser();


    /**
     * 删除用户
     *
     * @param request 请求入参
     * @return boolean 是否删除成功
     */
    boolean removeUser(AuthUserRequest request);


    /**
     * 构建缓存键
     *
     * @return {@link String} 缓存键
     */
    String buildCacheKey();

    /**
     * 登录成功后缓存登录的用户
     *
     * @param authUserResponse 用户信息响应
     * @param cacheKey         缓存key
     * @param token            令牌
     */
    void cacheUser(AuthUserResponse authUserResponse, String cacheKey, String token);

    /**
     * 登录成功后缓存登录的用户
     *
     * @param authUserResponse 用户信息响应
     * @param token            令牌
     */
    void cacheUser(AuthUserResponse authUserResponse, String token);

    /**
     * 是否存在令牌
     *
     * @return boolean true 存在令牌 false 不存在令牌
     */
    boolean hasToken();

    /**
     * 构建redis中user登录键
     *
     * @param tenantId  租户编号
     * @param clientCode  客户端编码
     * @param account   账户
     * @return {@link String} 键
     */
    String buildLoginKey(Long tenantId, String clientCode, Object account);

    /**
     * 获取租户编号
     *
     * @return {@link Long } 租户编号
     */
    Long getTenantId();

    /**
     * 获取客户端编码
     *
     * @return {@link String } 客户端编码
     */
    String getClientCode();

    /**
     * 获取账户
     *
     * @return {@link Object } 账户
     */
    Object getAccount();

    /**
     * 获取租户数据源键
     *
     * @return {@link String } 租户数据源键
     */
    String getTenantDataSourceKey();

}
